package com.demo.juc.threadlocal;

import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;

public class WeakHashMapDemo {
    public static void main(String[] args) {
        myHashMap();
        System.out.println("==========");
        myWeakHashMap();
    }

    private static void myHashMap() {
        Map<Integer, String> map = new HashMap<>();
        Integer key = new Integer(1);
        String value = "HashMap";

        map.put(key, value);
        System.out.println(map);

        key = null;

        System.gc();

        System.out.println(map);
    }

    private static void myWeakHashMap() {
        WeakHashMap<Integer, String> map = new WeakHashMap<>();
        Integer key = new Integer(1);
        String value = "WeakHashMap";

        map.put(key, value);
        System.out.println(map);

        key = null;

        System.gc();

        System.out.println(map);
    }


    /**
     * 强引用：没有引用指向它的时候就被回收，Java 95%对象都是强引用
     * 软引用：比较适合用作缓存
     * 弱引用：解决某些地方内存泄露问题
     * 虚引用:管理堆外内存（jvm的内存是宿主机内存的一部分，例如：网络读取一个数据，先放在宿主机（os）内存，再拷贝到jvm内存，由jvm来管理，这样效率有点低）
     * 因此jvm提供一种直接内存管理，直接去访问os内存【jvm不是自己管理的内存，不能直接进行垃圾回收的，jvm只能垃圾回收自己管理的地方，堆外内存是不能回收的】
     * 例如:DirectByBuffer对象，是由堆外内存管理的。jvm通过监听一个队列来清理堆外内存【当对象被回收时，通过Qveve可以检测到，然后清理堆外内存——就是通过虚引用】
     */
    //
}